#include "archivo.h"

Archivo::Archivo(std::string& nombre, unsigned int tam_bloque, unsigned int tam_bloque_indice){
	this->nombre = nombre;
	this->reg_base = NULL;
	this->tam_bloque = tam_bloque;
	this->fd = -1;
	this->cant_bloques = 0;
	this->tam_bloque_indice = tam_bloque_indice;

}

Archivo::~Archivo(){
	if (this->reg_base != NULL)
		delete(this->reg_base);	
}
		
TipoStruct * Archivo::get_registro_base(){
	return this->reg_base;	
}
		
std::string& Archivo::get_nombre(){
	return this->nombre;
}

int Archivo::get_fd(){
	return this->fd;
}

unsigned int Archivo::get_tam_bloque(){
	return this->tam_bloque;	
}

unsigned int Archivo::get_cant_bloques(){
	return this->cant_bloques;
}

TipoStruct * Archivo::generar_reg_base(std::string& formato_reg){
	TipoStruct * formato;
	
	try{
		//parseo el formato
		FuncProcStructCrear funcStruct;
		FuncProcAtomCrear funcAtom;
		formato = new TipoStruct(true);
		Parser::procesar_datos_secundarios(formato_reg, formato,funcAtom,funcStruct);
		return formato;
	}
	catch(ExcepArchInexistente &e){
		//solo para que quede explicito
		delete formato;
		throw e;
	}
	catch(ExcepSintaxisParser &e){
		delete formato;
		throw e;	
	}
	
	
}
void Archivo::cargar_registro_base(std::string formato_reg) throw(ExcepSintaxisParser){
	
	
	
	this->reg_base = generar_reg_base(formato_reg); 
	if (reg_base->get_tamanio() != 0){
		if( ((*reg_base)[0].get_codigo_tipo() != INT) && ((*reg_base)[0].get_codigo_tipo() != STRING) ){
			reg_base = NULL;
			throw ExcepSintaxisParser("Error - El campo 0 debe ser int o string. ");
		}
	}
}

long Archivo::get_tam() throw(ExcepArchCerrado){
	if (this-> fd != -1)
		return cant_bloques * tam_bloque;
	else
		throw ExcepArchCerrado("Error - El archivo : "+ this-> get_nombre() +" esta cerrado. ");	
	
}

bool Archivo::operator==(const Archivo& a2) const {
	return (this->nombre.compare(a2.nombre) == 0);
}  

unsigned int Archivo::get_tam_indice(){
	return tam_bloque_indice;
	
}

